#!/bin/bash

string_1='                  '
string_2='---------------------------'
green='\e[32m'
red='\e[31m'
defult='\e[39m'
blue='\e[34m'
end='\e[0m'

character=()
character_count=0
password=()
result=""

usage="\n使用方法：$blue 脚本名 密码总位数 大写字母位数 小写字母位数 数字位数 特殊字符位数$end\n\
        \n如生成8位密码，其中大写字母1位，小写字母1位，数字两位，特殊字符1位，则命令为：\n\
        \n     ./random_password 8 1 1 5 1 \n"

init_password()
{
    for((i=1;i<=$1;i++))
    do
        password+=('--')
    done
}

character_init()
{
    if [ $1 == 'a' ];then
        character=('a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' \
                'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z')
        character_count=26
    elif [ $1 == 'A' ];then
        character=('A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' \
                'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z')
        character_count=26
    elif [ $1 == '0' ];then
        character=(0 1 2 3 4 5 6 7 8 9)
        character_count=10
    elif [ $1 == '?' ];then
        character=('!' '@' '#' '$' '%' '^' '&' '*' '(' ')' )
        character_count=10
    fi
}

#将随机生成的字符插入到password数组的随机位置
#参数1是字符种类，参数2是密码总位数，参数3是此种字符位数
rand_password()
{
    #已经插入到password数组中的字符的个数
    insert_count=0
    
    #初始化password数组
    character_init $1

    while :
    do
        #如果已经插入的字符数小于所需字符数则继续
        if [ $insert_count -lt $3 ];then
            #随机生成一位参数1指定的字符
            word=${character[$[RANDOM%$character_count]]}
            #生成password中的随机位置
            n=$[RANDOM%$2]
            #如果password中的位置n没有插入过则将随机字符插入到位置n
            if [ ${password[n]} == '--' ];then
                password[n]=$word
                insert_count=$[ $insert_count + 1 ]
            else
                continue
            fi
        else
            break
        fi
    done
}


if [[ $# -lt 5 ]];then
    echo -e $usage
    exit
fi

if [[ $[$2 + $3 + $4 + $5] -ne $1 ]];then
    echo -e "$red \n各字符位数之和与密码总位数不相等！$end"
    echo -e $usage
    exit
fi

echo -e "$green\n正在为您生成密码，请稍候..."

sleep 1

init_password $1

rand_password 'A' $1 $2
rand_password 'a' $1 $3
rand_password '0' $1 $4
rand_password '?' $1 $5

for(( i=1; i<=$1; i++  ))
do
    index=$[$i - 1]
    result="$result${password[$index]}"
done

echo -e "$green\n已为您生成随机密码：$result\n$end"

exit